﻿using System;
using System.Collections.Generic;
using System.IO;

namespace FolderSynchronizer
{
    /// <summary>
    /// Интерфейс синхронизатора.
    /// </summary>
    public interface ISynchronizer
    {
        /// <summary>
        /// Путь к исходному каталогу
        /// </summary>
        string SourceFolder { get; }

        /// <summary>
        /// Путь к конечному каталогу.
        /// </summary>
        string TargetFolder { get; }

        /// <summary>
        /// Пути к каталогам, которые должны быть очищены перед копированием в них.
        /// </summary>
        string[] PureFolders { get; }

        /// <summary>
        /// Пути к каталогам, которые нальзя удалять.
        /// </summary>
        string[] ExcludeFolders { get; }

        /// <summary>
        /// Относительные пути к файлам в конечном каталоге, которые не нужно обновлять.
        /// </summary>
        string[] ExcludeFiles { get; }

        /// <summary>
        /// Полность ли совпадают два каталога после копирования
        /// </summary>
        bool FullMatchDirectories { get; }

        /// <summary>
        /// Скопировано ли в промежуточный каталог.
        /// </summary>
        Action InTempFolder { get; }

        /// <summary>
        /// Путь к файлу с информацией о файлах в релизе.
        /// </summary>
        string CheckSumFile { get; }

        /// <summary>
        /// Количество скопированных файлов.
        /// </summary>
        int CountOfCopedFiles { get; set; }

        /// <summary>
        /// Путь к промежуточному каталогу.
        /// </summary>
        string PathToTempFolder { get; }

        /// <summary>
        /// Массив с информацие о файлах в исходной папке.
        /// </summary>
        FileInfo[] SourcePathFiles { get; }

        /// <summary>
        /// Массив с информацией  о файлах  в конечной папке.
        /// </summary>
        List<FileInfo> TargetPathFiles { get; }

        /// <summary>
        /// Список директорий исходной папки.
        /// </summary>
        List<DirectoryInfo> TargetDirInfo { get; }

        /// <summary>
		/// Список файлов для копирования.
		/// </summary>
        List<FileInformation> FilesForCopy { get; }

        /// <summary>
        /// Конфигурация синхронизации.
        /// </summary>
        SynchronizerSettings Settings { get; }

        /// <summary>
        /// Копирование файлов с использованием вспомогательной папки.
        /// </summary>
        void Synchronize();

        /// <summary>
        /// Удаление папки.
        /// </summary>
        /// <param name="tmp">Путь к удаляемой папке.</param>
        void DeleteFolder(string tmp);
    }
}